package com.aleyn.annotation

import kotlin.reflect.KClass

/**
 * @author: Aleyn
 * @date: 2023/7/28 11:28
 *
 * 工厂模式（Factory）依赖注入注解。
 *
 * 此注解用于标记一个类，表示该类由 LRouter 的依赖注入容器管理，
 * 并且每次请求该类型的实例时，容器都会创建一个**新的**实例。
 * 这适用于那些无状态或者需要隔离实例的场景。
 *
 * 使用示例：
 * ```kotlin
 * // 每次注入都会创建一个新的 Presenter 实例
 * @Factory
 * class MyPresenter(private val repository: MyRepository)
 *
 * // 将实现类 MyRepositoryImpl 绑定到 MyRepository 接口
 * // 当请求 MyRepository 类型的实例时，容器会创建一个新的 MyRepositoryImpl 实例
 * @Factory(bind = MyRepository::class)
 * class MyRepositoryImpl : MyRepository
 * ```
 *
 * @param bind 可选参数，用于将当前实现类绑定到一个特定的父类或接口。
 *             当指定了 `bind` 类型后，你可以通过请求 `bind` 指定的类型来获取当前类的实例。
 *             这在面向接口编程时非常有用。如果未指定，则默认绑定到当前类自身。
 *             `Unit::class` 是一个占位符，表示未指定绑定类型。
 */
@Retention(AnnotationRetention.SOURCE)
@Target(AnnotationTarget.CLASS)
annotation class Factory(val bind: KClass<*> = Unit::class)
